package com.example.hrsystem.workflow;

import android.content.Context;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 审批工具类
 * 提供审批相关的通用功能和辅助方法
 */
public class ApprovalUtils {
    
    /**
     * 日期格式化工具
     */
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
    private static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm");
    
    /**
     * 计算两个日期之间的天数差（包括起始日和结束日）
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 天数差
     */
    public static int calculateDays(Date startDate, Date endDate) {
        if (startDate == null || endDate == null) {
            return 0;
        }
        
        Calendar start = Calendar.getInstance();
        start.setTime(startDate);
        start.set(Calendar.HOUR_OF_DAY, 0);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        start.set(Calendar.MILLISECOND, 0);
        
        Calendar end = Calendar.getInstance();
        end.setTime(endDate);
        end.set(Calendar.HOUR_OF_DAY, 23);
        end.set(Calendar.MINUTE, 59);
        end.set(Calendar.SECOND, 59);
        end.set(Calendar.MILLISECOND, 999);
        
        // 计算天数差
        long startTime = start.getTimeInMillis();
        long endTime = end.getTimeInMillis();
        
        // 一天的毫秒数
        long oneDay = 24 * 60 * 60 * 1000;
        
        // 计算两个日期之间的天数
        long dayCount = (endTime - startTime) / oneDay + 1;
        
        return Math.max(0, (int) dayCount);
    }
    
    /**
     * 计算两个时间之间的小时差
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 小时差
     */
    public static double calculateHours(Date startTime, Date endTime) {
        if (startTime == null || endTime == null) {
            return 0;
        }
        
        long diffInMillis = endTime.getTime() - startTime.getTime();
        return diffInMillis / (1000 * 60 * 60.0);
    }
    
    /**
     * 格式化日期为字符串
     * @param date 日期
     * @return 格式化后的字符串
     */
    public static String formatDate(Date date) {
        if (date == null) {
            return "";
        }
        return DATE_FORMAT.format(date);
    }
    
    /**
     * 格式化日期时间为字符串
     * @param dateTime 日期时间
     * @return 格式化后的字符串
     */
    public static String formatDateTime(Date dateTime) {
        if (dateTime == null) {
            return "";
        }
        return DATE_TIME_FORMAT.format(dateTime);
    }
    
    /**
     * 格式化时间为字符串
     * @param time 时间
     * @return 格式化后的字符串
     */
    public static String formatTime(Date time) {
        if (time == null) {
            return "";
        }
        return TIME_FORMAT.format(time);
    }
    
    /**
     * 解析日期字符串
     * @param dateStr 日期字符串
     * @return 日期对象
     */
    public static Date parseDate(String dateStr) {
        try {
            return DATE_FORMAT.parse(dateStr);
        } catch (Exception e) {
            return null;
        }
    }
    
    /**
     * 解析日期时间字符串
     * @param dateTimeStr 日期时间字符串
     * @return 日期时间对象
     */
    public static Date parseDateTime(String dateTimeStr) {
        try {
            return DATE_TIME_FORMAT.parse(dateTimeStr);
        } catch (Exception e) {
            return null;
        }
    }
    
    /**
     * 根据审批状态获取对应的颜色资源ID
     * @param context 上下文
     * @param status 审批状态
     * @return 颜色资源ID
     */
    public static int getStatusColor(Context context, String status) {
        ApprovalStatus approvalStatus = ApprovalStatus.fromValue(status);
        
        switch (approvalStatus) {
            case PENDING:
                return context.getResources().getColor(android.R.color.holo_orange_light);
            case IN_PROGRESS:
                return context.getResources().getColor(android.R.color.holo_blue_light);
            case APPROVED:
                return context.getResources().getColor(android.R.color.holo_green_light);
            case REJECTED:
                return context.getResources().getColor(android.R.color.holo_red_light);
            case CANCELLED:
                return context.getResources().getColor(android.R.color.darker_gray);
            case COMPLETED:
                return context.getResources().getColor(android.R.color.holo_purple);
            default:
                return context.getResources().getColor(android.R.color.darker_gray);
        }
    }
    
    /**
     * 根据审批状态获取状态显示名称
     * @param status 审批状态值
     * @return 状态显示名称
     */
    public static String getStatusDisplayName(String status) {
        return ApprovalStatus.fromValue(status).getDisplayName();
    }
    
    /**
     * 获取请求类型的中文名称
     * @param requestType 请求类型
     * @return 请求类型中文名称
     */
    public static String getRequestTypeDisplayName(String requestType) {
        switch (requestType) {
            case "LEAVE":
                return "请假申请";
            case "OVERTIME":
                return "加班申请";
            case "BUSINESS_TRIP":
                return "出差申请";
            default:
                return "其他申请";
        }
    }
    
    /**
     * 验证请假天数是否有效
     * @param days 请假天数
     * @return 是否有效
     */
    public static boolean isValidLeaveDays(int days) {
        return days > 0 && days <= 30; // 假设请假天数限制在30天以内
    }
    
    /**
     * 验证加班时长是否有效
     * @param hours 加班时长（小时）
     * @return 是否有效
     */
    public static boolean isValidOvertimeHours(double hours) {
        return hours > 0 && hours <= 24; // 假设单次加班时长不超过24小时
    }
    
    /**
     * 验证出差天数是否有效
     * @param days 出差天数
     * @return 是否有效
     */
    public static boolean isValidBusinessTripDays(int days) {
        return days > 0 && days <= 90; // 假设出差天数限制在90天以内
    }
    
    /**
     * 获取默认审批人ID
     * @return 默认审批人ID
     */
    public static int getDefaultApproverId() {
        // 实际应用中，应该根据组织结构获取直属上级ID
        // 这里简单返回一个固定值
        return 1001; // 假设默认审批人ID为1001
    }
    
    /**
     * 生成审批单号
     * @param requestType 请求类型
     * @return 审批单号
     */
    public static String generateApprovalNumber(String requestType) {
        StringBuilder sb = new StringBuilder();
        
        // 添加类型前缀
        switch (requestType) {
            case "LEAVE":
                sb.append("LV-");
                break;
            case "OVERTIME":
                sb.append("OT-");
                break;
            case "BUSINESS_TRIP":
                sb.append("BT-");
                break;
            default:
                sb.append("AP-");
        }
        
        // 添加日期
        sb.append(new SimpleDateFormat("yyyyMMdd").format(new Date()));
        sb.append("-");
        
        // 添加随机数
        sb.append(String.format("%04d", (int) (Math.random() * 10000)));
        
        return sb.toString();
    }
}